home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / mus / misc / DelfScope.lha / DelfScope / src / scope_asm.a < prev    next >
Text File  |  2000-10-03  |  9KB  |  426 lines

  1. ;*****************************************************************************
  2. ;
  3. ;    DelfScope - oscilloscope/analyzer for Delfina DSP
  4. ;    Copyright (C) 2000  Michael Henke
  5. ;
  6. ;    This program is free software; you can redistribute it and/or modify
  7. ;    it under the terms of the GNU General Public License as published by
  8. ;    the Free Software Foundation; either version 2 of the License, or
  9. ;    (at your option) any later version.
  10. ;
  11. ;    This program is distributed in the hope that it will be useful,
  12. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;    GNU General Public License for more details.
  15. ;
  16. ;    You should have received a copy of the GNU General Public License
  17. ;    along with this program; if not, write to the Free Software
  18. ;    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. ;
  20. ;*****************************************************************************
  21.  
  22.  
  23.  
  24.     XDEF    _ASM_prepare_plot
  25.     XDEF    _ASM_pcm_plot
  26.     XDEF    _ASM_fft_plot
  27.  
  28.     XREF    _GFXBASE
  29.  
  30.     section    smack1,code
  31.  
  32. ;*******************************************************************
  33. _ASM_prepare_plot
  34.     movem.l    d0-d7/a0-a6,-(a7)
  35.     moveq    #0,d1
  36.     moveq    #0,d2
  37.     moveq    #0,d3
  38.     moveq    #0,d4
  39.     moveq    #0,d5
  40.     moveq    #0,d6
  41.     moveq    #0,d7
  42.     sub.l    a0,a0
  43.     sub.l    a1,a1
  44.     sub.l    a2,a2
  45.     sub.l    a3,a3
  46.     sub.l    a4,a4
  47.     sub.l    a5,a5    ;13*4=52 bytes
  48.     lea    (plot_fastbuf_end),a6    ;192*2*512/8=24576 bytes
  49.     move    #472-1,d0
  50. .loop    movem.l    d1-d7/a0-a5,-(a6)    ;472*52=24544 bytes
  51.     dbf    d0,.loop
  52.     movem.l    d1-d7/a0,-(a6)        ;24544+32=24576 bytes
  53.     movem.l    (a7)+,d0-d7/a0-a6
  54.     rts
  55.  
  56.  
  57.  
  58. ;*******************************************************************
  59. _ASM_fft_plot
  60. ; a0 - fftbuf
  61. ; a1 - chipmem
  62. ; a2 - rastport (NULL for direct-chipmem mode)
  63.  
  64.     movem.l    d0-d7/a0-a6,-(a7)
  65.     move.l    a2,(rp)
  66.  
  67. ;******    plot to FastRAM
  68.     lea    (plot_fastbuf+512/8*255),a2
  69.     moveq    #512/8,d2
  70.     lea    (spectrum_peaks),a3
  71.     moveq    #416/8-1,d7
  72.     move    #$00ff,d4
  73. .fft0_loop
  74.     moveq    #-$80,d3
  75. .fft1_loop
  76.     move    (a0)+,d0
  77.     lsr    #7,d0        ;8bit sample (must be positive!)
  78.     and    d4,d0
  79.     lsl    #6,d0        ;offset = sample * 64
  80.     neg    d0
  81.     move    (a3),d1        ;get old peak (negative)
  82.     add    d2,d1        ;decrement
  83.     cmp    d0,d1
  84.     bmi    .fft_peak
  85.     move    d0,d1        ;set new peak
  86. .fft_peak
  87.     move    d1,(a3)+    ;put new peak
  88.     or.b    d3,(a2,d1)    ;draw peak
  89. .fft2_loop
  90.     or.b    d3,(a2,d0)
  91.     add    d2,d0
  92.     ble.b    .fft2_loop
  93.     lsr.b    #1,d3
  94.     bne.b    .fft1_loop
  95.     addq.l    #1,a2
  96.     dbf    d7,.fft0_loop
  97.  
  98.  
  99. ;******    copy to ChipRAM
  100.     lea    (plot_fastbuf),a0
  101.     move.l    rp(pc),d0
  102.     beq.b    .fft_direct_chipmem
  103.  
  104.     lea    bmap(pc),a2
  105.     move    #512/8,(a2)    ;bmap.BytesPerRow
  106.     move    #256,2(a2)    ;bmap.Rows
  107.     move.l    a0,8(a2)    ;bmap.Planes[0]
  108.     move.l    a2,a0        ;a0=source bitmap
  109.     move.l    d0,a1        ;a1=dest rastport
  110.     moveq    #0,d0        ;d0=source topleft x
  111.     moveq    #0,d1        ;d1=source topleft y
  112.     move.l    #192,d2        ;d2=dest topleft x
  113.     moveq    #113,d3        ;d3=dest topleft y
  114.     move.l    #416,d4        ;d4=width
  115.     move.l    #256,d5        ;d5=height
  116.     move.l    #$c0,d6        ;d6=minterm (ABC|ABNC)
  117.     move.l    (_GFXBASE),a6
  118.     jsr    -606(a6)    ;BltBitMapRastPort()
  119.     bra.b    .fft_end
  120.  
  121. .fft_direct_chipmem
  122.     move    #255,d7
  123.     moveq    #(512-416)/8,d0
  124.     moveq    #(640-416)/8,d1
  125. .fft_copy_loop
  126.     move.l    (a0)+,(a1)+    ;01
  127.     move.l    (a0)+,(a1)+    ;02
  128.     move.l    (a0)+,(a1)+    ;03
  129.     move.l    (a0)+,(a1)+    ;04
  130.     move.l    (a0)+,(a1)+    ;05
  131.     move.l    (a0)+,(a1)+    ;06
  132.     move.l    (a0)+,(a1)+    ;07
  133.     move.l    (a0)+,(a1)+    ;08
  134.     move.l    (a0)+,(a1)+    ;09
  135.     move.l    (a0)+,(a1)+    ;10
  136.     move.l    (a0)+,(a1)+    ;11
  137.     move.l    (a0)+,(a1)+    ;12
  138.     move.l    (a0)+,(a1)+    ;13
  139.     add.l    d0,a0
  140.     add.l    d1,a1
  141.     dbf    d7,.fft_copy_loop
  142. .fft_end
  143.     movem.l    (a7)+,d0-d7/a0-a6
  144.     rts
  145.  
  146.  
  147.  
  148. rp    dc.l    0
  149. bmap    dc.w    0,0    ;BytesPerRow, Rows
  150.     dc.b    0,1    ;Flags, Depth
  151.     dc.w    0    ;Pad
  152.     dc.l    0,0,0,0,0,0,0,0    ;Planes
  153.  
  154.  
  155. ;*******************************************************************
  156. _ASM_pcm_plot
  157. ; a0 - pcmbuf
  158. ; a1 - chipmem
  159. ; d0 - numsamp (max. 512)
  160.     movem.l    d0-d7/a0-a6,-(a7)
  161.     move.l    a0,-(a7)        ;push a0=pcmbuf
  162.     move.l    a1,-(a7)        ;push a1=pcmbuf
  163.     move.l    d0,-(a7)        ;push d0=numsamp
  164.     move    d0,d7
  165.     add    #31,d7
  166.     lsr    #5,d7            ;d7=numsamp/32            !! d7
  167. ;******    left channel
  168.     lea    (plot_fastbuf+512/8*96),a2
  169.     bsr.b    .plot
  170.     lea    (plot_fastbuf),a0
  171.     bsr.b    .copy
  172.     move.l    (a7)+,d0        ;pop d0=numsamp
  173.     move.l    (a7)+,a1        ;pop a1=pcmbuf
  174.     move.l    (a7)+,a0        ;pop a0=pcmbuf
  175. ;******    right channel
  176.     lea    (plot_fastbuf+512/8*(96+192)),a2
  177.     add    #1024,a0
  178.     bsr.b    .plot
  179.     lea    (plot_fastbuf+512/8*192),a0
  180.     add.l    #640/8*192,a1
  181.     bsr.b    .copy
  182.     movem.l    (a7)+,d0-d7/a0-a6
  183.     rts
  184.  
  185.  
  186. ;******    plot to FastRAM
  187. .plot    lsr    #3,d0
  188.     subq    #1,d0
  189.     move.b    (a0),d1        ;get sample
  190.     ext    d1
  191.     neg    d1
  192.     move    d1,d5
  193.     add    d1,d1
  194.     add    d5,d1
  195.     asr    #2,d1        ;sample *= 3/4
  196. .plot0_loop
  197.     moveq    #-$80,d3
  198. .plot1_loop
  199.     move.b    (a0)+,d2    ;get sample
  200.     moveq    #512/8,d4
  201.     ext    d2
  202.     neg    d2
  203.     move    d2,d5
  204.     add    d2,d2
  205.     add    d5,d2
  206.     asr    #2,d2        ;sample *= 3/4
  207.     move    d2,d5
  208.     lsl    #6,d5        ;offset = sample * 64
  209.     sub    d2,d1
  210.     beq.b    .plot2_loop
  211.     subq    #1,d1
  212.     bge.b    .plot2_loop
  213.     not    d1
  214.     neg    d4
  215.     subq    #1,d1
  216. .plot2_loop
  217.     or.b    d3,(a2,d5)
  218.     add    d4,d5
  219.     dbf    d1,.plot2_loop
  220.     move    d2,d1
  221.     lsr.b    #1,d3
  222.     bne.b    .plot1_loop
  223.     addq.l    #1,a2
  224.     dbf    d0,.plot0_loop
  225.     rts
  226.  
  227.  
  228. ;******    copy to ChipRAM
  229. .copy    move    #192-1,d3
  230.     move    .cpjmp(pc,d7*2),d2
  231.     jmp    .cpjmp(pc,d2)
  232.  
  233. .cpjmp    dc.w    .cp01-.cpjmp
  234.     dc.w    .cp01-.cpjmp,.cp02-.cpjmp,.cp03-.cpjmp,.cp04-.cpjmp
  235.     dc.w    .cp05-.cpjmp,.cp06-.cpjmp,.cp07-.cpjmp,.cp08-.cpjmp
  236.     dc.w    .cp09-.cpjmp,.cp10-.cpjmp,.cp11-.cpjmp,.cp12-.cpjmp
  237.     dc.w    .cp13-.cpjmp,.cp14-.cpjmp,.cp15-.cpjmp,.cp16-.cpjmp
  238. .cp01
  239. .cp02
  240. .cp03
  241. .cp04
  242. .cp05
  243. .cp06
  244. .cp07
  245. .cp08    moveq    #(16-08)*4,d0
  246.     moveq    #(16-08)*4+16,d1
  247. .loop08    move.l    (a0)+,(a1)+    ;01
  248.     move.l    (a0)+,(a1)+    ;02
  249.     move.l    (a0)+,(a1)+    ;03
  250.     move.l    (a0)+,(a1)+    ;04
  251.     move.l    (a0)+,(a1)+    ;05
  252.     move.l    (a0)+,(a1)+    ;06
  253.     move.l    (a0)+,(a1)+    ;07
  254.     move.l    (a0)+,(a1)+    ;08
  255.     add.l    d0,a0
  256.     add.l    d1,a1
  257.     dbf    d3,.loop08
  258.     rts
  259. .cp09    moveq    #(16-09)*4,d0
  260.     moveq    #(16-09)*4+16,d1
  261. .loop09    move.l    (a0)+,(a1)+    ;01
  262.     move.l    (a0)+,(a1)+    ;02
  263.     move.l    (a0)+,(a1)+    ;03
  264.     move.l    (a0)+,(a1)+    ;04
  265.     move.l    (a0)+,(a1)+    ;05
  266.     move.l    (a0)+,(a1)+    ;06
  267.     move.l    (a0)+,(a1)+    ;07
  268.     move.l    (a0)+,(a1)+    ;08
  269.     move.l    (a0)+,(a1)+    ;09
  270.     add.l    d0,a0
  271.     add.l    d1,a1
  272.     dbf    d3,.loop09
  273.     rts
  274. .cp10    moveq    #(16-10)*4,d0
  275.     moveq    #(16-10)*4+16,d1
  276. .loop10    move.l    (a0)+,(a1)+    ;01
  277.     move.l    (a0)+,(a1)+    ;02
  278.     move.l    (a0)+,(a1)+    ;03
  279.     move.l    (a0)+,(a1)+    ;04
  280.     move.l    (a0)+,(a1)+    ;05
  281.     move.l    (a0)+,(a1)+    ;06
  282.     move.l    (a0)+,(a1)+    ;07
  283.     move.l    (a0)+,(a1)+    ;08
  284.     move.l    (a0)+,(a1)+    ;09
  285.     move.l    (a0)+,(a1)+    ;10
  286.     add.l    d0,a0
  287.     add.l    d1,a1
  288.     dbf    d3,.loop10
  289.     rts
  290. .cp11    moveq    #(16-11)*4,d0
  291.     moveq    #(16-11)*4+16,d1
  292. .loop11    move.l    (a0)+,(a1)+    ;01
  293.     move.l    (a0)+,(a1)+    ;02
  294.     move.l    (a0)+,(a1)+    ;03
  295.     move.l    (a0)+,(a1)+    ;04
  296.     move.l    (a0)+,(a1)+    ;05
  297.     move.l    (a0)+,(a1)+    ;06
  298.     move.l    (a0)+,(a1)+    ;07
  299.     move.l    (a0)+,(a1)+    ;08
  300.     move.l    (a0)+,(a1)+    ;09
  301.     move.l    (a0)+,(a1)+    ;10
  302.     move.l    (a0)+,(a1)+    ;11
  303.     add.l    d0,a0
  304.     add.l    d1,a1
  305.     dbf    d3,.loop11
  306.     rts
  307. .cp12    moveq    #(16-12)*4,d0
  308.     moveq    #(16-12)*4+16,d1
  309. .loop12    move.l    (a0)+,(a1)+    ;01
  310.     move.l    (a0)+,(a1)+    ;02
  311.     move.l    (a0)+,(a1)+    ;03
  312.     move.l    (a0)+,(a1)+    ;04
  313.     move.l    (a0)+,(a1)+    ;05
  314.     move.l    (a0)+,(a1)+    ;06
  315.     move.l    (a0)+,(a1)+    ;07
  316.     move.l    (a0)+,(a1)+    ;08
  317.     move.l    (a0)+,(a1)+    ;09
  318.     move.l    (a0)+,(a1)+    ;10
  319.     move.l    (a0)+,(a1)+    ;11
  320.     move.l    (a0)+,(a1)+    ;12
  321.     add.l    d0,a0
  322.     add.l    d1,a1
  323.     dbf    d3,.loop12
  324.     rts
  325. .cp13    moveq    #(16-13)*4,d0
  326.     moveq    #(16-13)*4+16,d1
  327. .loop13    move.l    (a0)+,(a1)+    ;01
  328.     move.l    (a0)+,(a1)+    ;02
  329.     move.l    (a0)+,(a1)+    ;03
  330.     move.l    (a0)+,(a1)+    ;04
  331.     move.l    (a0)+,(a1)+    ;05
  332.     move.l    (a0)+,(a1)+    ;06
  333.     move.l    (a0)+,(a1)+    ;07
  334.     move.l    (a0)+,(a1)+    ;08
  335.     move.l    (a0)+,(a1)+    ;09
  336.     move.l    (a0)+,(a1)+    ;10
  337.     move.l    (a0)+,(a1)+    ;11
  338.     move.l    (a0)+,(a1)+    ;12
  339.     move.l    (a0)+,(a1)+    ;13
  340.     add.l    d0,a0
  341.     add.l    d1,a1
  342.     dbf    d3,.loop13
  343.     rts
  344. .cp14    moveq    #(16-14)*4,d0
  345.     moveq    #(16-14)*4+16,d1
  346. .loop14    move.l    (a0)+,(a1)+    ;01
  347.     move.l    (a0)+,(a1)+    ;02
  348.     move.l    (a0)+,(a1)+    ;03
  349.     move.l    (a0)+,(a1)+    ;04
  350.     move.l    (a0)+,(a1)+    ;05
  351.     move.l    (a0)+,(a1)+    ;06
  352.     move.l    (a0)+,(a1)+    ;07
  353.     move.l    (a0)+,(a1)+    ;08
  354.     move.l    (a0)+,(a1)+    ;09
  355.     move.l    (a0)+,(a1)+    ;10
  356.     move.l    (a0)+,(a1)+    ;11
  357.     move.l    (a0)+,(a1)+    ;12
  358.     move.l    (a0)+,(a1)+    ;13
  359.     move.l    (a0)+,(a1)+    ;14
  360.     add.l    d0,a0
  361.     add.l    d1,a1
  362.     dbf    d3,.loop14
  363.     rts
  364. .cp15    moveq    #(16-15)*4,d0
  365.     moveq    #(16-15)*4+16,d1
  366. .loop15    move.l    (a0)+,(a1)+    ;01
  367.     move.l    (a0)+,(a1)+    ;02
  368.     move.l    (a0)+,(a1)+    ;03
  369.     move.l    (a0)+,(a1)+    ;04
  370.     move.l    (a0)+,(a1)+    ;05
  371.     move.l    (a0)+,(a1)+    ;06
  372.     move.l    (a0)+,(a1)+    ;07
  373.     move.l    (a0)+,(a1)+    ;08
  374.     move.l    (a0)+,(a1)+    ;09
  375.     move.l    (a0)+,(a1)+    ;10
  376.     move.l    (a0)+,(a1)+    ;11
  377.     move.l    (a0)+,(a1)+    ;12
  378.     move.l    (a0)+,(a1)+    ;13
  379.     move.l    (a0)+,(a1)+    ;14
  380.     move.l    (a0)+,(a1)+    ;15
  381.     add.l    d0,a0
  382.     add.l    d1,a1
  383.     dbf    d3,.loop15
  384.     rts
  385. .cp16    moveq    #(16-16)*4+16,d1
  386. .loop16    move.l    (a0)+,(a1)+    ;01
  387.     move.l    (a0)+,(a1)+    ;02
  388.     move.l    (a0)+,(a1)+    ;03
  389.     move.l    (a0)+,(a1)+    ;04
  390.     move.l    (a0)+,(a1)+    ;05
  391.     move.l    (a0)+,(a1)+    ;06
  392.     move.l    (a0)+,(a1)+    ;07
  393.     move.l    (a0)+,(a1)+    ;08
  394.     move.l    (a0)+,(a1)+    ;09
  395.     move.l    (a0)+,(a1)+    ;10
  396.     move.l    (a0)+,(a1)+    ;11
  397.     move.l    (a0)+,(a1)+    ;12
  398.     move.l    (a0)+,(a1)+    ;13
  399.     move.l    (a0)+,(a1)+    ;14
  400.     move.l    (a0)+,(a1)+    ;15
  401.     move.l    (a0)+,(a1)+    ;16
  402.     add.l    d1,a1
  403.     dbf    d3,.loop16
  404.     rts
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.     section    smack2,bss
  412.     ds.b    1024    ;safety...
  413. plot_fastbuf
  414.     ds.b    512/8*192
  415.     ds.b    512/8*192
  416. plot_fastbuf_end
  417.     ds.b    1024    ;safety...
  418.  
  419. spectrum_peaks
  420.     ds.w    512
  421.  
  422.  
  423.  
  424.  
  425.     END
  426.